package com.sybil.ot.servicio;

import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
import com.sybil.ot.dao.HistoricoOTDAO;
import com.sybil.ot.dao.OrdenTrabajoDAO;
import com.sybil.ot.dominio.DefectoParo;
import com.sybil.ot.dominio.DefectoParoPK;
import com.sybil.ot.dominio.Empleado;
import com.sybil.ot.dominio.HistoricoOT;
import com.sybil.ot.dominio.HistoricoOTPK;
import com.sybil.ot.dominio.Mantenimiento;
import com.sybil.ot.dominio.MantenimientoPK;
import com.sybil.ot.dominio.OrdenTrabajo;
import com.sybil.ot.dominio.Tarea;
import com.sybil.ot.dominio.TrabajoRealizado;
import java.awt.Color;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.mail.MessagingException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

@Service("ordenTrabajoService")
@Transactional(readOnly = true)
public class OrdenTrabajoService {

   @Autowired
   private OrdenTrabajoDAO ordenTrabajoDAO;
   @Autowired
   private HistoricoOTDAO historicoOTDAO;
   @Autowired
   private EmailService emailService;
   @Autowired
   private EmpleadoService empleadoService;

   public void guardar(OrdenTrabajo ordenTrabajo) {
      ordenTrabajo.getLlave().setSerie("A");
      ordenTrabajo.setEstatus("A");
      if ("N".equalsIgnoreCase(ordenTrabajo.getGeneroParo())) {
         ordenTrabajo.setTiempoParo(0);
         ordenTrabajo.setCausaParo(null);
      }
      ordenTrabajo.setTiempoRespuesta(0);
//      ordenTrabajo.getLlave().setNumero(ordenTrabajoDAO.obtenerSecuencia(ordenTrabajo.getLlave().getSerie()));
      Integer secuencia = ordenTrabajoDAO.obtenerSecuencia(ordenTrabajo.getLlave().getSerie());
      List<Mantenimiento> mantenimientos = ordenTrabajo.getMantenimientos();
      for (int i = 0; i < mantenimientos.size(); i++) {
         if (!"".equals(mantenimientos.get(i).getEquipo().getClave())) {
            OrdenTrabajo ot = new OrdenTrabajo(ordenTrabajo.getLlave().getSerie(), secuencia);
            ot.setCausaParo(ordenTrabajo.getCausaParo());
            ot.setDescripcion(ordenTrabajo.getDescripcion());
            ot.setEmpleado(ordenTrabajo.getEmpleado());
            ot.setEstatus(ordenTrabajo.getEstatus());
            ot.setFechaInicio(ordenTrabajo.getFechaInicio());
            ot.setGeneroParo(ordenTrabajo.getGeneroParo());
            ot.setPlanta(ordenTrabajo.getPlanta());
            ot.setSolicitante(ordenTrabajo.getSolicitante());
            ot.setTiempoParo(ordenTrabajo.getTiempoParo());
            ot.setZona(ordenTrabajo.getZona());
            ot.setUsuarioCreo(ordenTrabajo.getUsuarioCreo());

            ot.setMantenimientos(new ArrayList<Mantenimiento>());
            Mantenimiento mtto = new Mantenimiento(ot.getLlave().getSerie(), ot.getLlave().getNumero(), 1);
            mtto.setUsuarioCreo(ot.getUsuarioCreo());
            mtto.setProveedor(mantenimientos.get(i).getProveedor());
            mtto.setEquipo(mantenimientos.get(i).getEquipo());
            mtto.setTipoTrabajo(mantenimientos.get(i).getTipoTrabajo());
            ot.getMantenimientos().add(mtto);

            ot.setHistoricos(new ArrayList<HistoricoOT>());
            HistoricoOT hist = new HistoricoOT(ot.getLlave().getSerie(), ot.getLlave().getNumero(), 1);
            hist.setUsuario(ot.getSolicitante().getClave());
            hist.setFecha(new Date());
            hist.setDescripcion(ot.getDescripcion());
            hist.setEstatus(ot.getEstatus());
            hist.setFechaFin(ot.getFechaFin());
            hist.setTiempoRespuesta(ot.getTiempoRespuesta());
            hist.setUsuarioCreo(ot.getUsuarioCreo());
            ot.getHistoricos().add(hist);
            ordenTrabajoDAO.guardarOrdenTrabajo(ot);

            if (!ot.getSolicitante().getClave().equals(ot.getEmpleado().getClave())) {
               Empleado obtenerEmpleado = empleadoService.obtenerEmpleado(ot.getEmpleado().getCodigo());

               obtenerEmpleado.setEmail("canche.moises@cmoctezuma.com.mx");

               if (obtenerEmpleado.getEmail() != null) {
                  String mensaje = "Estimado/a " + obtenerEmpleado.getNombre()
                          + "<br/>Se ha creado una orden de trabajo a su cargo, favor de atenderla.<br/>"
                          + "OT #" + ot.getLlave().getNumero() + "<br/>"
                          + "Plantas o equipos: ";
                  for (Mantenimiento m : ot.getMantenimientos()) {
                     mensaje += "<br/>Equipo:" + m.getEquipo().getClave();
                  }
                  try {
                     emailService.enviarEmailHTML("Sistema Facturas OT Concretos<facturas.ot@cmoctezuma.com.mx>",
                             obtenerEmpleado.getEmail(), "Orden de trabajo " + ot.getLlave().getNumero() + " a su cargo", mensaje);
                  } catch (MessagingException ex) {
                     //no se envio
                     String error = ex.getMessage();
                  }
               }
            }
            secuencia++;
         }
         if (!"".equals(mantenimientos.get(i).getPlanta().getClave())) {
            OrdenTrabajo ot = new OrdenTrabajo(ordenTrabajo.getLlave().getSerie(), secuencia);
            ot.setCausaParo(ordenTrabajo.getCausaParo());
            ot.setDescripcion(ordenTrabajo.getDescripcion());
            ot.setEmpleado(ordenTrabajo.getEmpleado());
            ot.setEstatus(ordenTrabajo.getEstatus());
            ot.setFechaInicio(ordenTrabajo.getFechaInicio());
            ot.setGeneroParo(ordenTrabajo.getGeneroParo());
            ot.setPlanta(ordenTrabajo.getPlanta());
            ot.setSolicitante(ordenTrabajo.getSolicitante());
            ot.setTiempoParo(ordenTrabajo.getTiempoParo());
            ot.setZona(ordenTrabajo.getZona());
            ot.setUsuarioCreo(ordenTrabajo.getUsuarioCreo());

            ot.setMantenimientos(new ArrayList<Mantenimiento>());
            Mantenimiento mtto = new Mantenimiento(ot.getLlave().getSerie(), ot.getLlave().getNumero(), 1);
            mtto.setUsuarioCreo(ot.getUsuarioCreo());
            mtto.setProveedor(mantenimientos.get(i).getProveedor());
            mtto.setPlanta(mantenimientos.get(i).getPlanta());
            mtto.setTipoTrabajo(mantenimientos.get(i).getTipoTrabajo());
            ot.getMantenimientos().add(mtto);

            ot.setHistoricos(new ArrayList<HistoricoOT>());
            HistoricoOT hist = new HistoricoOT(ot.getLlave().getSerie(), ot.getLlave().getNumero(), 1);
            hist.setUsuario(ot.getSolicitante().getClave());
            hist.setFecha(new Date());
            hist.setDescripcion(ot.getDescripcion());
            hist.setEstatus(ot.getEstatus());
            hist.setFechaFin(ot.getFechaFin());
            hist.setTiempoRespuesta(ot.getTiempoRespuesta());
            hist.setUsuarioCreo(ot.getUsuarioCreo());
            ot.getHistoricos().add(hist);
            ordenTrabajoDAO.guardarOrdenTrabajo(ot);

            if (!ot.getSolicitante().getClave().equals(ot.getEmpleado().getClave())) {
               Empleado obtenerEmpleado = empleadoService.obtenerEmpleado(ot.getEmpleado().getCodigo());

               obtenerEmpleado.setEmail("canche.moises@cmoctezuma.com.mx");

               if (obtenerEmpleado.getEmail() != null) {
                  String mensaje = "Estimado/a " + obtenerEmpleado.getNombre()
                          + "<br/>Se ha creado una orden de trabajo a su cargo, favor de atenderla.<br/>"
                          + "OT #" + ot.getLlave().getNumero() + "<br/>"
                          + "Plantas o equipos: ";
                  for (Mantenimiento m : ot.getMantenimientos()) {
                     mensaje += "<br/>Planta:" + m.getPlanta().getClave();
                  }
                  try {
                     emailService.enviarEmailHTML("Sistema Facturas OT Concretos<facturas.ot@cmoctezuma.com.mx>",
                             obtenerEmpleado.getEmail(), "Orden de trabajo " + ot.getLlave().getNumero() + " a su cargo", mensaje);
                  } catch (MessagingException ex) {
                     //no se envio
                     String error = ex.getMessage();
                  }
               }
            }
            secuencia++;
         }
//         mantenimientos.get(i).setLlave(new MantenimientoPK(ordenTrabajo.getLlave().getSerie(), ordenTrabajo.getLlave().getNumero(), i + 1));
//         mantenimientos.get(i).setUsuarioCreo(ordenTrabajo.getUsuarioCreo());
      }
//      ordenTrabajo.setHistoricos(new ArrayList<HistoricoOT>());
//      List<HistoricoOT> historicos = ordenTrabajo.getHistoricos();
//      HistoricoOT hist = new HistoricoOT();
//      hist.setLlave(new HistoricoOTPK(ordenTrabajo.getLlave().getSerie(), ordenTrabajo.getLlave().getNumero(), 1));
//      hist.setUsuario(ordenTrabajo.getUsuarioCreo());
//      hist.setUsuarioCreo(ordenTrabajo.getUsuarioCreo());
//      hist.setFecha(new Date());
//      hist.setDescripcion(ordenTrabajo.getDescripcion());
//      hist.setEstatus(ordenTrabajo.getEstatus());
//      hist.setFechaFin(ordenTrabajo.getFechaFin());
//      hist.setTiempoRespuesta(ordenTrabajo.getTiempoRespuesta());
//      hist.setComentarios(null);
//      historicos.add(hist);
//      ordenTrabajoDAO.guardarOrdenTrabajo(ordenTrabajo);
//      if (!ordenTrabajo.getSolicitante().getClave().equals(ordenTrabajo.getEmpleado().getClave())) {
//         Empleado obtenerEmpleado = empleadoService.obtenerEmpleado(ordenTrabajo.getEmpleado().getCodigo());
//
//         obtenerEmpleado.setEmail("canche.moises@cmoctezuma.com.mx");
//
//         if (obtenerEmpleado.getEmail() != null) {
//            String mensaje = "Estimado/a " + obtenerEmpleado.getNombre()
//                    + "<br/>Se ha creado una orden de trabajo a su cargo, favor de atenderla.<br/>"
//                    + "OT #" + ordenTrabajo.getLlave().getNumero() + "<br/>"
//                    + "Plantas o equipos: ";
//            for (Mantenimiento m : ordenTrabajo.getMantenimientos()) {
//               mensaje += "<br/>" + (!"".equals(m.getPlanta().getClave()) ? "Planta:" + m.getPlanta().getClave()
//                       : "Equipo:" + m.getEquipo().getClave());
//            }
//            try {
//               emailService.enviarEmailHTML("Sistema Facturas OT Concretos<facturas.ot@cmoctezuma.com.mx>",
//                       obtenerEmpleado.getEmail(), "Orden de trabajo " + ordenTrabajo.getLlave().getNumero() + " a su cargo", mensaje);
//            } catch (MessagingException ex) {
//               //no se envio
//               String error = ex.getMessage();
//            }
//         }
//      }

//      List<DefectoParo> defectos = ordenTrabajo.getDefectos();
//      if (defectos != null) {
//         Iterator<DefectoParo> i = defectos.iterator();
//         int contadorDef = 0;
//         while (i.hasNext()) {
//            DefectoParo def = i.next();
//            if ("".equals(def.getDefecto().getClave())
//                    || "".equals(def.getCausa().getClave())
//                    || "".equals(def.getAccion().getClave())) {
//               i.remove();
//            } else {
//               def.setLlave(new DefectoParoPK(ordenTrabajo.getLlave().getSerie(), ordenTrabajo.getLlave().getNumero(), ++contadorDef));
//               def.setUsuarioCreo(ordenTrabajo.getUsuarioCreo());
//            }
//         }
//      }
   }

   public void editar(OrdenTrabajo ordenTrabajo) {
      if ("N".equalsIgnoreCase(ordenTrabajo.getGeneroParo())) {
         ordenTrabajo.setTiempoParo(0);
         ordenTrabajo.setCausaParo(null);
      }
      List<Mantenimiento> mantenimientos = ordenTrabajo.getMantenimientos();
      for (int i = 0; i < mantenimientos.size(); i++) {
         if (mantenimientos.get(i).getLlave() == null) {
            mantenimientos.get(i).setLlave(new MantenimientoPK(ordenTrabajo.getLlave().getSerie(), ordenTrabajo.getLlave().getNumero(), i + 1));
            mantenimientos.get(i).setUsuarioCreo(ordenTrabajo.getUsuarioCreo());
         } else {
            mantenimientos.get(i).setUsuarioModif(ordenTrabajo.getUsuarioModif());
         }
      }
      List<DefectoParo> defectos = ordenTrabajo.getDefectos();
      if (defectos != null) {
         Iterator<DefectoParo> i = defectos.iterator();
         int contadorDef = 0;
         while (i.hasNext()) {
            DefectoParo def = i.next();
            contadorDef++;
            if ("".equals(def.getDefecto().getClave()) || "".equals(def.getCausa().getClave())
                    || "".equals(def.getAccion().getClave())) {
               i.remove();
            } else {
               if ("".equals(def.getLlave().getSerieOT()) && def.getLlave().getNumeroOT() == 0 
                       && def.getLlave().getNumeroDefecto() == 0) {
                  def.setLlave(new DefectoParoPK(ordenTrabajo.getLlave().getSerie(),
                          ordenTrabajo.getLlave().getNumero(), contadorDef));
                  def.setUsuarioCreo(ordenTrabajo.getUsuarioCreo());
               } else {
                  def.setUsuarioModif(ordenTrabajo.getUsuarioModif());
               }
            }
         }
      }
      ordenTrabajo.setHistoricos(new ArrayList<HistoricoOT>());
      HistoricoOT hist = new HistoricoOT();
      int siguienteHistorico = historicoOTDAO.obtenerSecuencia(ordenTrabajo.getLlave().getSerie(), ordenTrabajo.getLlave().getNumero());
      hist.setLlave(new HistoricoOTPK(ordenTrabajo.getLlave().getSerie(), ordenTrabajo.getLlave().getNumero(), siguienteHistorico));
      hist.setUsuario(ordenTrabajo.getUsuarioCreo());
      hist.setUsuarioCreo(ordenTrabajo.getUsuarioCreo());
      hist.setFecha(new Date());
      hist.setDescripcion(ordenTrabajo.getDescripcion());
      hist.setEstatus(ordenTrabajo.getEstatus());
      hist.setFechaFin(ordenTrabajo.getFechaFin());
      hist.setTiempoRespuesta(ordenTrabajo.getTiempoRespuesta());
      hist.setRutaAnexo(ordenTrabajo.getRutaAnexo());
//      hist.setComentarios(null);
      ordenTrabajo.getHistoricos().add(hist);
      List<TrabajoRealizado> trabajosRealizados = ordenTrabajo.getTrabajosRealizados();
      if (trabajosRealizados != null) {
         double porcentaje = trabajosRealizados.get(0).getPorcentajeIva();
         Iterator<TrabajoRealizado> trabajos = trabajosRealizados.iterator();
         int contadorTrabajos = 0;
         while (trabajos.hasNext()) {
            ++contadorTrabajos;
            TrabajoRealizado trabajo = trabajos.next();
            if (trabajo.getDescripcion() == null || "".equals(trabajo.getDescripcion())) {
               trabajos.remove();
            } else {
               if ("".equals(trabajo.getLlave().getSerieOT()) && trabajo.getLlave().getNumeroOT() == 0
                       && trabajo.getLlave().getNumeroTrabajoRealizado() == 0) {
                  trabajo.getLlave().setSerieOT(ordenTrabajo.getLlave().getSerie());
                  trabajo.getLlave().setNumeroOT(ordenTrabajo.getLlave().getNumero());
                  trabajo.getLlave().setNumeroTrabajoRealizado(contadorTrabajos);
                  trabajo.setUsuarioCreo(ordenTrabajo.getUsuarioCreo());
                  trabajo.setPorcentajeIva(porcentaje);
               } else {
                  trabajo.setUsuarioModif(ordenTrabajo.getUsuarioCreo());
//                  trabajo.setPorcentajeIva(porcentaje);
               }
            }
         }
      }
      ordenTrabajoDAO.editarOrdenTrabajo(ordenTrabajo);
   }

   public void complementar(OrdenTrabajo ordenTrabajo, MultipartFile anexoOT) {
      if (!anexoOT.isEmpty()) {
         String extension = anexoOT.getOriginalFilename().substring(anexoOT.getOriginalFilename().lastIndexOf("."), anexoOT.getOriginalFilename().length());
         String rutaAnexo = "C:\\TEMP_WEB\\ANEXO_OT" + ordenTrabajo.getLlave().getSerie()
                 + "_" + ordenTrabajo.getLlave().getNumero() + extension;
         FileOutputStream streamEscritura = null;
         InputStream archivo = null;
         try {
            archivo = anexoOT.getInputStream();
            streamEscritura = new FileOutputStream(rutaAnexo);
            byte[] buffer = new byte[1024];
            int leido = 0;
            while ((leido = archivo.read(buffer)) != -1) {
               streamEscritura.write(buffer, 0, leido);
            }
         } catch (IOException ex) {
//            Logger.getLogger(OrdenTrabajoService.class.getName()).log(Level.SEVERE, null, ex);
         } finally {
            if (archivo != null) {
               try {
                  archivo.close();
               } catch (IOException ex) {
                  ex.getMessage();
               }
            }
            if (streamEscritura != null) {
               try {
                  streamEscritura.close();
               } catch (IOException ex) {
                  ex.getMessage();
               }
            }
         }
         ordenTrabajo.setRutaAnexo(rutaAnexo);
      }
      if (ordenTrabajo.getFechaFin() != null && !"".equals(ordenTrabajo.getFechaFin())) {
         long respuesta = ordenTrabajo.getFechaFin().getTime() - ordenTrabajo.getFechaInicio().getTime();
         ordenTrabajo.setTiempoRespuesta((respuesta / 1000) / 60);//convertido en minutos
      }
      ordenTrabajo.setEstatus("C");
      editar(ordenTrabajo);
   }

   @Transactional(readOnly = false)
   public void eliminarOrdenTrabajo(String serie, int numero) {
      OrdenTrabajo ordenTrabajo = ordenTrabajoDAO.obtenerOrdenTrabajo(serie, numero);
      ordenTrabajoDAO.eliminarOrdenTrabajo(ordenTrabajo);
   }

   public List<OrdenTrabajo> obtenerOrdenesTrabajo() {
      return ordenTrabajoDAO.obtenerOrdenesTrabajo();
   }

   public List<OrdenTrabajo> obtenerOrdenesTrabajoProveedor(String numeroProveedor) {
      return ordenTrabajoDAO.obtenerOrdenesTrabajo(numeroProveedor);
   }

   public OrdenTrabajo obtenerOrdenTrabajo(String serie, int numero) {
      return ordenTrabajoDAO.obtenerOrdenTrabajo(serie, numero);
   }

   public void actualizaEstatus(String serie, int numero, String estatus) {
      OrdenTrabajo ordenTrabajo = ordenTrabajoDAO.obtenerOrdenTrabajo(serie, numero);
      ordenTrabajo.setEstatus(estatus);
      ordenTrabajoDAO.editarOrdenTrabajo(ordenTrabajo);
   }

   public String generarPDF(String serie, int numero) {
      String rutaArchivoPDF = "C:\\TEMP_WEB\\CHECKLIST_" + serie.trim() + "_" + numero + ".pdf";
      try {
         OrdenTrabajo ordenTrabajo = ordenTrabajoDAO.obtenerOrdenTrabajo(serie, numero);
         Document documentoPDF = new Document();
         PdfWriter writer = PdfWriter.getInstance(documentoPDF, new FileOutputStream(rutaArchivoPDF));
         documentoPDF.open();

         PdfPTable tablaDetalleOT = new PdfPTable(new float[]{1, 3, 1, 3});
         tablaDetalleOT.setWidthPercentage(100f);
         tablaDetalleOT.getDefaultCell().setUseAscender(true);
         tablaDetalleOT.getDefaultCell().setUseDescender(true);
         Font f = new Font();
         f.setColor(Color.WHITE);
         PdfPCell cell = new PdfPCell(new Phrase("Orden de trabajo General No." + ordenTrabajo.getLlave().getNumero(), f));
         cell.setBackgroundColor(Color.BLACK);
         cell.setHorizontalAlignment(Element.ALIGN_CENTER);
         cell.setColspan(4);
         tablaDetalleOT.addCell(cell);
         tablaDetalleOT.getDefaultCell().setBackgroundColor(Color.WHITE);
         tablaDetalleOT.addCell("Numero:");
         tablaDetalleOT.addCell("" + ordenTrabajo.getLlave().getNumero());
         tablaDetalleOT.addCell("Estatus:");
         String status = "";
         if ("A".equals(ordenTrabajo.getEstatus())) {
            status = "Abierta";
         } else if ("C".equals(ordenTrabajo.getEstatus())) {
            status = "Complementada";
         } else if ("P".equals(ordenTrabajo.getEstatus())) {
            status = "En Pedido";
         } else if ("F".equals(ordenTrabajo.getEstatus())) {
            status = "Finalizada";
         } else if ("X".equals(ordenTrabajo.getEstatus())) {
            status = "Cancelada";
         } else {
            status = "Otro";
         }
         tablaDetalleOT.addCell(status);
         tablaDetalleOT.addCell("Fecha:");
         tablaDetalleOT.addCell(ordenTrabajo.getFechaInicio().toString());
         tablaDetalleOT.addCell("Solicitante:");
         tablaDetalleOT.addCell(ordenTrabajo.getSolicitante().getNombre());
         tablaDetalleOT.addCell("Responsable:");
         tablaDetalleOT.addCell(ordenTrabajo.getEmpleado().getNombre());
         tablaDetalleOT.addCell("Zona:");
         tablaDetalleOT.addCell(ordenTrabajo.getZona().getDescripcion());
         documentoPDF.add(tablaDetalleOT);

         PdfPTable tablaEquipos = new PdfPTable(new float[]{3, 3, 3, 3, 3});
         tablaEquipos.setWidthPercentage(100f);
         tablaEquipos.getDefaultCell().setUseAscender(true);
         tablaEquipos.getDefaultCell().setUseDescender(true);
         Font f2 = new Font();
         f2.setColor(Color.WHITE);
         PdfPCell cell2 = new PdfPCell(new Phrase("Planta/Equipo de mantenimiento", f2));
         cell2.setBackgroundColor(Color.BLACK);
         cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
         cell2.setColspan(5);
         tablaEquipos.addCell(cell2);
         tablaEquipos.getDefaultCell().setBackgroundColor(Color.LIGHT_GRAY);
         tablaEquipos.addCell("Tipo Equipo");
         tablaEquipos.addCell("No Eco/Nombre");
         tablaEquipos.addCell("Clase");
         tablaEquipos.addCell("Tipo de trabajo");
         tablaEquipos.addCell("Proveedor");
         tablaEquipos.getDefaultCell().setBackgroundColor(null);
         for (Mantenimiento mtto : ordenTrabajo.getMantenimientos()) {
            String tipo = "", equipo = "";
            if (mtto.getPlanta() != null) {
               tipo = "PLANTA DE CONCRETO";
               equipo = mtto.getPlanta().getValorMuestra();
            } else if (mtto.getEquipo() != null) {
               tipo = mtto.getEquipo().getTipoEquipo().getDescripcionCorta();
               equipo = mtto.getEquipo().getValorMuestra();
            }
            tablaEquipos.addCell(tipo);
            tablaEquipos.addCell(equipo);
            tablaEquipos.addCell(mtto.getTipoTrabajo().getClase().getDescripcionCorta());
            tablaEquipos.addCell(mtto.getTipoTrabajo().getDescripcionCorta());
            tablaEquipos.addCell(mtto.getProveedor().getValorMuestra());
         }
         documentoPDF.add(tablaEquipos);

         PdfPTable tablaGeneroParo = new PdfPTable(new float[]{1, 3, 1, 3});
         tablaGeneroParo.setWidthPercentage(100f);
         tablaGeneroParo.getDefaultCell().setUseAscender(true);
         tablaGeneroParo.getDefaultCell().setUseDescender(true);
         Font f3 = new Font();
         f3.setColor(Color.WHITE);
         PdfPCell cell3 = new PdfPCell(new Phrase("", f3));
         cell3.setBackgroundColor(Color.BLACK);
         cell3.setHorizontalAlignment(Element.ALIGN_CENTER);
         cell3.setColspan(4);
         tablaGeneroParo.addCell(cell3);
         tablaGeneroParo.getDefaultCell().setBackgroundColor(Color.WHITE);
         tablaGeneroParo.addCell("Generó Paro:");
         tablaGeneroParo.addCell("S".equals(ordenTrabajo.getGeneroParo()) ? "Si" : "No");
         tablaGeneroParo.addCell("Tiempo:");
         tablaGeneroParo.addCell("" + ordenTrabajo.getTiempoParo());
         tablaGeneroParo.addCell("Causa:");
         tablaGeneroParo.addCell(ordenTrabajo.getCausaParo() != null ? ordenTrabajo.getCausaParo().getDescripcionCorta() : "");
         tablaGeneroParo.addCell("Descripcion de la OT:");
         tablaGeneroParo.addCell(ordenTrabajo.getDescripcion());
         documentoPDF.add(tablaGeneroParo);
         documentoPDF.newPage();

         PdfPTable tablaCheckList = new PdfPTable(new float[]{3, 3, 5, 1});
         tablaCheckList.setWidthPercentage(100f);
         tablaCheckList.getDefaultCell().setUseAscender(true);
         tablaCheckList.getDefaultCell().setUseDescender(true);
         Font f4 = new Font();
         f4.setColor(Color.WHITE);
         PdfPCell cell4 = new PdfPCell(new Phrase("Checklist", f4));
         cell4.setBackgroundColor(Color.BLACK);
         cell4.setHorizontalAlignment(Element.ALIGN_CENTER);
         cell4.setColspan(4);
         tablaCheckList.addCell(cell4);
         tablaCheckList.getDefaultCell().setBackgroundColor(Color.LIGHT_GRAY);
         tablaCheckList.addCell("Clase");
         tablaCheckList.addCell("Tipo trabajo");
         tablaCheckList.addCell("Tarea");
         tablaCheckList.addCell("Si");
         tablaCheckList.getDefaultCell().setBackgroundColor(null);

         for (Mantenimiento mante : ordenTrabajo.getMantenimientos()) {
            List<Tarea> tareas = mante.getTipoTrabajo().getTareas();
            if (!tareas.isEmpty()) {
               for (int i = 0; i < tareas.size(); i++) {
                  tablaCheckList.addCell(mante.getTipoTrabajo().getClase().getDescripcionCorta());
                  tablaCheckList.addCell(mante.getTipoTrabajo().getDescripcionCorta());
                  tablaCheckList.addCell(tareas.get(i).getDescripcion());

                  PdfContentByte content = writer.getDirectContent();
                  PdfTemplate template = content.createTemplate(30, 30);
                  template.setLineWidth(0.5f);
                  template.rectangle(0, 0, 17f, 17f);
                  template.stroke();

                  Image img = Image.getInstance(template);
                  Chunk chunk = new Chunk(img, 1f, 1f);

                  PdfPCell cellx = new PdfPCell();
                  cellx.addElement(chunk);
                  tablaCheckList.addCell(cellx);
               }
            }
         }
         documentoPDF.add(tablaCheckList);

         documentoPDF.close();
      } catch (DocumentException ex) {
//         Logger.getLogger(OrdenTrabajoService.class.getName()).log(Level.SEVERE, null, ex);
      } catch (FileNotFoundException ex) {
//         Logger.getLogger(OrdenTrabajoService.class.getName()).log(Level.SEVERE, null, ex);
      }
      return rutaArchivoPDF;
   }
}
